package 剑指offer;

import java.util.Scanner;

/**
 * @description:
 * @author: ywk
 * @date: 2020-09-20
 */
public class ASCII转化 {
    /**
     * 在URL字符串中，如果百分号%后面跟了两个十六进制数字，那么它表示相应ASCII值所对应的字符，
     * 如%2F表示'/'，%32表示'2'。%编码还可以进行嵌套，如%%32F可以解码成%2F，再进一步解码成/。
     * 如果没有任何百分号后面跟的是两个十六进制数字则无法再进行解码。
     * <p>
     * 现在有一系列的URL，小强希望你帮忙进行百分号解码，直到无法再解码为止。
     *
     * @param args
     */
    public static void main(String[] args) {
//        System.out.println(asciiToString("%2F"));
        Scanner sc = new Scanner(System.in);
        int lines = sc.nextInt();
        String[] arr = new String[lines];
        for (int i = 0; i < lines; i++) {
            arr[i] = sc.next();
        }

//        String[] arr = {"%2F"};
        resolve(arr);
    }

    public static void resolve(String[] arr) {
        int len = arr.length;
        char start = '%';
        for (int i = 0; i < len; i++) {
            String str = arr[i];
            //进行ascii码解析
            int index = str.lastIndexOf(start)+1;
            if (index == 0) {
                continue;
            }
            while (index + 2 <=str.length() && index > 0) {
                String temp = str.substring(index, index + 2);
                String strTail = asciiToString(temp) + str.substring(index + 2);
                str = str.substring(0, index-1) + strTail;
                index=str.lastIndexOf(start)+1;
            }
            arr[i] = str;
        }
        for (String s : arr) {
            System.out.println(s);
        }
    }

    public static String stringToAscii(String value) {
        StringBuffer sbu = new StringBuffer();
        char[] chars = value.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            if (i != chars.length - 1) {
                sbu.append((int) chars[i]).append(",");
            } else {
                sbu.append((int) chars[i]);
            }
        }
        return sbu.toString();
    }

    public static String asciiToString(String value) {
        String ascii = "0123456789ABCDEF";
        int len = value.length();
        int gap = 16;
        int sum = 0;
        for (int i = 0; i < value.length(); i++) {
            if (ascii.indexOf(value.charAt(i)) != -1) {
                int index = ascii.indexOf(value.charAt(i));
                sum += Math.pow(gap, len - 1 - i) * index;
            } else {
                return value;
            }
        }
        try {
            String.valueOf((char) sum);
        } catch (Exception e) {
            e.printStackTrace();
            return value;
        }
        return (char) sum + "";
    }
}
